import { ref, onUnmounted } from 'vue';

/**
 * 语音功能 Hook：封装语音识别、文本朗读及状态管理
 * @param {Function} onRecognitionResult - 语音识别结果回调（接收识别文本）
 * @returns {Object} 语音相关状态和方法
 */
export const useVoice = (onRecognitionResult) => {
    // 1. 语音相关响应式状态
    const voiceIsListening = ref(false); // 是否正在语音识别
    const recognition = ref(null);       // 语音识别实例
    const isSpeaking = ref(false);       // 是否正在朗读
    const speechSynthesis = ref(null);   // 语音合成实例
    const ifSpeakGetInput = ref(false); // 是否将朗读文本作为输入

    // 2. 初始化语音识别（处理浏览器兼容）
    const initRecognition = () => {
        // 兼容 Chrome/Safari 等浏览器
        const SpeechRecognition = window.SpeechRecognition || window.webkitSpeechRecognition;
        if (!SpeechRecognition) {
            alert('您的浏览器不支持语音识别，请更换 Chrome/Edge 等现代浏览器');
            return null;
        }

        const instance = new SpeechRecognition();
        instance.continuous = false;        // 仅识别一次（非持续识别）
        instance.interimResults = false;    // 不返回中间结果（仅返回最终结果）
        instance.lang = 'zh-CN';            // 识别语言：中文
        instance.maxAlternatives = 1;       // 仅保留最优识别结果

        // 识别开始回调
        instance.onstart = () => {
            voiceIsListening.value = true;
            console.log('语音识别已开始，正在聆听...');
        };

        // 识别结果回调（触发外部传入的处理函数）
        instance.onresult = (event) => {
            const transcript = event.results[0][0].transcript.trim(); // 获取识别文本
            if (transcript && typeof onRecognitionResult === 'function') {
                onRecognitionResult(transcript); // 将结果传递给外部组件
            }
        };

        // 识别结束回调（自动停止识别）
        instance.onend = () => {
            voiceIsListening.value = false;
            console.log('语音识别已结束');
        };

        // 识别错误回调
        instance.onerror = (event) => {
            voiceIsListening.value = false;
            const errorMsgMap = {
                "not-allowed": '麦克风权限被拒绝，请在浏览器设置中允许麦克风访问',
                "no-speech": '未检测到语音输入，请重新尝试',
                "audio-capture": '未找到麦克风设备，请确保麦克风已连接',
                "network": '语音识别依赖网络，请检查网络连接'
        };
            alert(`语音识别错误：${errorMsgMap[event.error] || event.error}`);
        };

        return instance;
    };

    // 3. 开始语音识别
    const startVoiceRecognition = () => {
        // 若正在识别/朗读，先停止
        if (voiceIsListening.value || isSpeaking.value) return;

        // 初始化识别实例（若未初始化）
        if (!recognition.value) {
            recognition.value = initRecognition();
            if (!recognition.value) return; // 浏览器不支持则终止
        }

        // 启动识别
        recognition.value.start();
    };

    // 4. 停止语音识别（手动终止）
    const stopVoiceRecognition = () => {
        if (recognition.value && voiceIsListening.value) {
            recognition.value.stop();
            voiceIsListening.value = false;
            console.log('已手动停止语音识别');
        }
    };

    // 5. 文本朗读功能
    const speakResponse = (text, options = {}) => {
        // 若正在朗读/识别，先停止
        if (isSpeaking.value || voiceIsListening.value) {
            stopSpeaking();
        }

        // 初始化语音合成实例
        speechSynthesis.value = window.speechSynthesis || null;
        if (!speechSynthesis.value) {
            alert('您的浏览器不支持文本朗读功能');
            return;
        }

        // 配置朗读参数（默认中文，支持外部自定义）
        const speakOptions = {
            lang: 'zh-CN',  // 朗读语言
            volume: 1,      // 音量（0-1）
            rate: 1,        // 语速（0.1-10）
            pitch: 1,       // 音调（0-2）
            ...options
        };

        // 创建朗读实例
        const utterance = new SpeechSynthesisUtterance(text);
        Object.assign(utterance, speakOptions);

        // 朗读开始回调
        utterance.onstart = () => {
            isSpeaking.value = true;
            console.log('文本朗读已开始');
        };

        // 朗读结束回调
        utterance.onend = () => {
            isSpeaking.value = false;
            console.log('文本朗读已结束');
        };

        // 朗读错误回调
        utterance.onerror = (event) => {
            isSpeaking.value = false;
            alert(`朗读错误：${event.error}`);
        };

        // 启动朗读
        speechSynthesis.value.speak(utterance);
    };

    // 6. 停止文本朗读（手动终止）
    const stopSpeaking = () => {
        if (speechSynthesis.value && isSpeaking.value) {
            speechSynthesis.value.cancel();
            isSpeaking.value = false;
            console.log('已手动停止文本朗读');
        }
    };

    // 7. 组件卸载时清理（防止内存泄漏）
    onUnmounted(() => {
        stopVoiceRecognition();
        stopSpeaking();
        recognition.value = null;
        speechSynthesis.value = null;
    });

    // 导出状态和方法给外部组件
    return {
        voiceIsListening,  // 是否正在语音识别
        recognition,       // 语音识别实例（一般外部无需直接操作）
        isSpeaking,        // 是否正在朗读
        speechSynthesis,   // 语音合成实例（一般外部无需直接操作）
        startVoiceRecognition,  // 开始语音识别
        stopVoiceRecognition,   // 停止语音识别
        speakResponse,          // 文本朗读
        stopSpeaking,           // 停止朗读
        ifSpeakGetInput         // 是否将语言识别结果作为输入
    };
};